#ifndef __STIMER_H
#define __STIMER_H
/**
 * @brief 是否使用外部类型定义
 * 
 */
//#define STIMER_CUSTOM_TYPEDEF
#if defined(STIMER_CUSTOM_TYPEDEF)
	#include <stdint.h>
#else
	#define uint32_t unsigned int
	#define uint16_t unsigned short
	#define uint8_t unsigned char
	#define NULL 0
#endif
/**
 * @brief 是否使用外部内存管理
 * 
 */
//#define STIMER_CUSTOM_MEM
#if defined(STIMER_CUSTOM_MEM)
	include "stdlib.h"
#else
/**
 * @brief 使用动态定时器可创建的定时器数量，如果有外部动态内存接口，则该处定义无效
 */
#define STIMER_MAX_NUMBER 10
#endif

#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
/**
 * @brief 定时器tick
 *
 */
extern uint32_t stimer_tick;
/**
 * @brief tick累加，中断中处理
 *
 */
#define timer_tick_inc() stimer_tick ++
/**
 * @brief 定时器数据结构
 * 
 */
typedef struct stimer{
	uint32_t init_count;
	uint32_t init_count_copy;
	uint32_t count;
	char running : 4;
	char started : 4;
	void* user_data;
	struct stimer* next;
	struct stimer* prev;
	void(*timeout_cb)(struct stimer*);
}stimer_t;
/**
 * @brief 创建定时器
 * 
 * @param timeout 回调函数
 * @param tick 定时时常
 * @param user_data 回调参数
 * @return stimer_t* 定时器句柄
 */
stimer_t* stimer_create(void(*timeout)(struct stimer*), uint32_t tick, void* user_data);
/**
 * @brief 删除定时器
 * 
 * @param timer 定时器句柄
 */
void stimer_delete(stimer_t* timer);
/**
 * @brief 启动定时器
 * 
 * @param timer 定时器句柄
 */
void stimer_start(stimer_t* timer);
/**
 * @brief 复位定时器
 * 
 * @param timer 定时器句柄
 */
void stimer_reset(stimer_t* timer);
/**
 * @brief 停止定时器
 * 
 * @param timer 定时器句柄
 */
void stimer_stop(stimer_t* timer);
/**
 * @brief 自定义时钟源，接口未实现，有必要再说
 * 
 * @param timer 定时器句柄
 * @param source tick源
 */
void stimer_custom_tick(stimer_t* timer, const uint32_t* source);
/**
 * @brief 定时器轮询
 * 
 */
void stimer_handler(void);

#ifdef __cplusplus
}
#endif // __cplusplus
#endif //
